package com.xtpt.disaster.utils;


import cn.hutool.core.io.file.PathUtil;
import com.xtpt.disaster.common.PropertyConfig;
import com.xtpt.disaster.common.consts.DBEnum;
import com.xtpt.disaster.common.consts.DataTypeEnum;
import com.xtpt.disaster.common.consts.OSTypeEenum;
import com.xtpt.disaster.common.consts.UrlConst;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

@Component
public class ServerPathUtil {

    @Autowired
    PropertyConfig config;

    /***
     *
     * 获取serverPath，并创建相应文件夹
     * @param taskId 任务ID
     * @param type 文件数据类型  0-数据库  1-文件   见 DataTypeEnum
     * @param dbType 数据库类型  0-MYSQL 1-ORACLE 2-SQLSERVER 3-达梦  5-神通  4-金仓   见 DBEnum
     * @param backupOpt  0-全量  1-增量 对应枚举类DbBackupTypeEnum
     * @return path 返回路径path，第一个值为文件全路径，第二个为文件所在文件夹路径
     */
    public String getServerPath(String taskId, String fileName, Integer type, Integer dbType, String backupOpt) {
       String path = config.getRootPath();
       DataTypeEnum dataTypeEnum = DataTypeEnum.getObject(type);
       DBEnum dbEnum = DBEnum.getObject(dbType);
       Date date = new Date();
       SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM");
       String datetime = dateFormat.format(date);
       if(null != dbEnum){
           // for db
           path = path + "/" + dataTypeEnum.getName() + "/" + dbEnum.getName() + "/" + backupOpt;
       }else {
           // for file
           path = path + "/" + dataTypeEnum.getName();
       }
       LogUtil.logger.info(path);

       // create and chmod
        path = path + "/" + datetime + "/" + taskId;
//        String[] file_command = {"/c", "mkdir", "-p", "-m", "777", path};
//        String[] file_command = {"/c", "mkdir", "-p", "-m", "777", path};
        if(!cn.hutool.core.io.file.PathUtil.exists(Paths.get(path),true))
        {
            PathUtil.mkdir(Paths.get(path));
        }
//        boolean res = ShellExec.callShell(file_command);
        if(cn.hutool.core.io.file.PathUtil.exists(Paths.get(path),true))
            return path;
        else
            return null;
  }

  public String getDBServerPath(String taskId, String fileName,Integer dbType,String backupOpt){
        return getServerPath(taskId, fileName, 0, dbType, backupOpt);
  }
  /**
   * @Description: 直接生成到根目录
   * @Author: hpc
   * @Date: 2022/1/4 下午 4:06
   * @param taskId: 任务ID
   * @param dataTypeEnum: 文件还是数据库DataTypeEnum ：0-数据库  1-文件
   * @param dbEnum: 若是数据库，数据库类型 DBEnum ：0-MYSQL 1-ORACLE 2-SQLSERVER 3-达梦  5-神通  4-金仓
   * @param backupOpt: 0-全量  1-增量 对应枚举类DbBackupTypeEnum
   * @param addUserPath: 在默认的基础上添加文件夹
   * @return: 返回文件存储的根路径
   **/
    public String getServerFilePathNew(String taskId, DataTypeEnum dataTypeEnum, DBEnum dbEnum,String backupOpt,String addUserPath){
        OSTypeEenum osType= OSTypeEenum.getObject(config.getServerOsType());
        String osPathSeparator="/";
        String[] path;
        if(osType==OSTypeEenum.WINDOWS)
        {
            osPathSeparator="\\";
        }
        if(null != dbEnum){
            path=new String[]{
                    config.getRootPath(),
                    dataTypeEnum.getName(),
                    dbEnum.getName(),
                    backupOpt,
                    taskId,
                    TimeUtil.dateMakerString("yyyyMMdd_HHmmss")
            };
        }else {
            path=new String[]{
                    config.getRootPath(),
                    dataTypeEnum.getName(),
                    TimeUtil.dateMakerString("yyyyMMdd_HHmmss"),
                    taskId
            };
        }
        String pathDir =String.join(osPathSeparator,path)+osPathSeparator;
        String retDir = String.join(osPathSeparator,path)+osPathSeparator;
        if(!StringUtils.isEmpty(addUserPath))
        {
            // 用户自定义路径
            pathDir+=addUserPath;
        }
        if(!cn.hutool.core.io.file.PathUtil.exists(Paths.get(pathDir),true))
        {
            cn.hutool.core.io.file.PathUtil.mkdir(Paths.get(pathDir));
        }
        return retDir;
    }

    /**
     * @Description: 获取并创建文件备份到服务器的路径
     * @Author: hpc
     * @Date: 2022/1/5 上午 11:13
     * @param taskId: 任务ID
     * @param addUserPath: 额外添加的路径
     * @return: java.lang.String
     **/
    public String getServerFileBackupPath(String taskId,String addUserPath){

        return getServerFilePathNew(taskId,DataTypeEnum.FILE,null,null,addUserPath);
    }

    /**
     * @Description: 获取并创建文件备份到服务器的路径
     * @Author: hpc
     * @Date: 2022/1/5 上午 11:13
     * @param taskId: 任务ID
     * @param addUserPath: 额外添加的路径
     * @return: java.lang.String
     **/
    public String getServerFileBackupPath(String taskId,DataTypeEnum dataTypeEnum,String addUserPath){

        return getServerFilePathNew(taskId,dataTypeEnum,null,null,addUserPath);
    }
    /**
     * @Description: 获取并创建文件备份到服务器的路径
     * @Author: hpc
     * @Date: 2022/1/5 上午 11:13
     * @param taskId: 任务ID
     * @return: java.lang.String
     **/
    public String getServerFileBackupPath(String taskId){

        return getServerFilePathNew(taskId,DataTypeEnum.FILE,null,null,null);
    }

    public String getServerFilePathDM(String taskId, String fileName, DataTypeEnum dataTypeEnum, DBEnum dbEnum,String backupOpt){
        String pathDir = config.getRootPath();
        if(null != dbEnum){
            // for db
            pathDir = pathDir +"/"+dataTypeEnum.getName()+"/"+dbEnum.getName()+"/"+backupOpt+"/"+taskId+"/";
        }else {
            // for file
            pathDir = pathDir +"/"+dataTypeEnum.getName()+"/"+taskId+"/";
        }
        if(!cn.hutool.core.io.file.PathUtil.exists(Paths.get(pathDir),true))
        {
            cn.hutool.core.io.file.PathUtil.mkdir(Paths.get(pathDir));
        }
        return pathDir+fileName;
    }


  public String getFileServerPath(String taskId, String fileName){
        return getServerPath(taskId,fileName,1,null,null);
  }

  public String getVirtualServerPath(String taskId, String fileName){
      return getServerPath(taskId,fileName,2,null,null);
  }

    /**
     * 拼接服务接口路径
     * @param requestPath 不包含host和port的请求路径
     * @return 完整路径
     */
    public String generateCallbackUrl(String requestPath)
    {
        String serverHostPort = "http://" + config.getServerIp() + ":"+ config.getServerPort();
        if(requestPath.startsWith("/"))
        {
            return serverHostPort+requestPath;
        }
        else
        {
            return serverHostPort+"/"+requestPath;
        }
    }

    /**
     * @Description: 判断文件列表是否存在于服务端，任何一个文件不存在则返回 false
     * @Author: hpc
     * @Date: 2021/12/2 上午 9:36
     * @param files:
     * @return: java.lang.Boolean
     **/
    public static Boolean allFileExist(List<String> files) {
        if(files==null || files.isEmpty())
        {
            return false;
        }
        for (String path:files) {
            if(!cn.hutool.core.io.file.PathUtil.isFile(Paths.get(path),true))
            {
                return false;
            }
        }
        return true;
    }
    /**
     * @Description: 去除末尾指定字符
     * @Author: hpc
     * @Date: 2022/1/5 上午 7:29
     * @param source: 源字符串
     * @param splitter: 要去除的字符
     * @return: java.lang.String
     **/
    public static String TrimEnd(String source,char splitter)
    {
        if(StringUtils.isEmpty(source))
        {
            return source;
        }
        int len = source.length();
        while ((len>0) && source.charAt(len-1)==splitter)
        {
            len--;
        }
        return source.substring(0,len);
    }
    /**
     * @Description: 去除路径末尾的路径分隔符
     * @Author: hpc
     * @Date: 2022/1/5 上午 10:47
     * @param path: 路径
     * @return: 去除路径末尾的路径分隔符（/或\）后的结果
     **/
    public static String TrimPathEndSeparator(String path)
    {
        if(StringUtils.isEmpty(path))
        {
            return path;
        }
        int len = path.length();
        while ((0<len) && (path.charAt(len-1)=='\\' || path.charAt(len-1)=='/'))
        {
            len--;
        }
        return path.substring(0,len);
    }
    /**
     * @Description: 去除路径末尾的路径分隔符
     * @Author: hpc
     * @Date: 2022/1/5 上午 10:47
     * @param path: 路径
     * @return: 去除路径末尾的路径分隔符（/或\）后的结果
     **/
    public static String IsFolderAndGetLastPart(String path)
    {
        String lastPart=null;
        if(StringUtils.isEmpty(path))
        {
            return null;
        }
        char lastChar = path.charAt(path.length()-1);
        if(lastChar=='\\' || lastChar=='/')
        {
            String tp = TrimPathEndSeparator(path);
            int sp= tp.lastIndexOf(String.valueOf(lastChar));
            lastPart=tp.substring(sp+1);
        }
        return lastPart;
    }
    /**
     * @Description: 判断文件列表是否存在于服务端
     * @Author: hpc
     * @Date: 2021/12/2 上午 9:36
     * @param filePath:
     * @return: java.lang.Boolean
     **/
    public static Boolean fileExist(String filePath) {
        if(filePath==null || filePath.isEmpty())
        {
            return false;
        }
        List<String> fileList = new ArrayList<>(1);
        fileList.add(filePath);
        return allFileExist(fileList);
    }
    public static  void main(String[] args){

//        LogUtil.logger.info("TEST");
//logger.info("TEST");
//        PropertyConfig config = new PropertyConfig();
//        logger.info(config.getRootPath());
//        getServerPath("123","test",0,0,"back");

    }
}
